[Swift 3.0] 関数ラベルのルールが変更になった話
今回はSwift3.0の変更点の中で個人的に修正箇所が多そうだなと思っている SE-0046 Establish consistent label behavior across all parameters including first labels (一貫性のあるラベルをつけよう) の話です。 とはいえ、修正内容はシンプルなので、そんなに問題は出ないのではないでしょうか。(多分...)
どういった変更?
Swift2.x までは、関数の最初の引数名は呼び出し側では省略されてました。
Swift3.0からは、引数のパラメーターは位置に関係なく同一の挙動となります。それにより最初の引数名が省略されなくなりました。
どう修正すれば良い?
呼び出す時に最初の引数にもラベルを付けます。
Swift2.x(今までの例)
func card(rank: Int, suit: Character) { ... } card(1, suit: "♠")
Swift3.0
func card(rank: Int, suit: Character) { ... } card(rank:1, suit: "♠")
移行の際に影響を少なくする方法
最初の引数のラベルに_
を付け、明示的に最初の引数のラベルを省略するようにします。
これにより、呼び出し側には影響がありません。
Swift3.0
func card(_ rank: Int, suit: Character) { ... } card(1, suit: "♠")
理想
今までの関数の名前を付ける時にXXXXXWith△△
のような名称を付けて、
△△
の部分(関数名の最後の文字)が最初の引数を表すような感じで名前を付けていた事もあるかもしれません。
Swift2.x(今までの例)
func tintWithColor(color: UIColor) { ... } tintWithColor(UIColor.red)
Swift3.0からは最初の引数にもラベルが付くので、XXXXXWith△△
のような場合、With△△
の部分が不要になります。
Swift3.0
func tint(color: UIColor) { ... } tint(color: UIColor.red)
さいごに
個人的にはWith
を名前に付けていたような関数名がすっきりするので良いと思いました。
WWDC2016でも、
Simpler and more consistent
What's New in Swift | WWDC2016
とありました。
API naming often encourages first parameter label
Any parameter label may be suppressed with _
Swift3.0変更点シリーズ?としては他にも、
があります。?